package com.hnit.controllers;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hnit.service.UserService;
import com.hnit.web.DTO.UserDTO;
import com.hnit.web.Utils.ResponseResult;
import com.hnit.web.bean.User;
import jakarta.validation.Valid;
import lombok.extern.java.Log;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 用户管理 REST API 控制器。
 */
@Log
@RestController
@RequestMapping("/users") // 所有用户管理相关的接口都以 /users 开头
public class MyUserController {

    private final UserService userService;

    public MyUserController(UserService userService) {
        this.userService = userService;
    }

    /**
     * 查询所有用户（仅限管理员）。
     * URL: GET /users
     * 权限：只有拥有 'ADMIN' 角色的用户才能访问。
     */
    @GetMapping("/getUsers")
    @PreAuthorize("hasRole('ADMIN')")
    public ResponseEntity<ResponseResult> getAllUsers(
            @RequestParam(defaultValue = "1") int pageNum,
            @RequestParam(defaultValue = "10") int pageSize,
            @RequestParam(required = false) String userName,
            @RequestParam(required = false) String email,
            @RequestParam(required = false) Integer userStatus
    ) {
        // 调用 Service 层方法，并传递所有查询参数
        IPage<UserDTO> users = userService.getAllUsers(pageNum, pageSize, userName, email, userStatus);
        return ResponseEntity.ok(ResponseResult.ok().setData(users));
    }

    /**
     * 根据ID查询用户信息（管理员可以查询所有，普通用户只能查询自己）。
     * URL: GET /users/{id}
     * 权限：拥有 'ADMIN' 角色，或者请求的用户ID与路径中的ID一致。
     */
    @GetMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN') or #id == authentication.principal")
    public ResponseEntity<UserDTO> getUserById(@PathVariable Long id) {
        // 获取当前认证用户的ID (从 Gateway 传递的 X-User-ID 头中获取)
        String currentUserId = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

        // 如果不是管理员且请求的ID不是当前用户ID，则拒绝访问
        if (!SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream()
                .anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN")) && !currentUserId.equals(String.valueOf(id))) {
            return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); // 403 Forbidden
        }

        Optional<UserDTO> user = userService.getUserById(id);
        return user.map(ResponseEntity::ok)
                .orElseGet(() -> ResponseEntity.notFound().build()); // 404 Not Found
    }

    /**
     * 更新用户状态
     * admin
     */
    @PutMapping("/{userId}/status")
    @PreAuthorize("hasRole('ADMIN')")
    public ResponseEntity<ResponseResult> updateUserStatus(@PathVariable("userId") Long userId, @RequestBody Map<String, Object> statusData) {
        try {
            // 从请求体中获取状态字段
            String status = (String) statusData.get("status");
            if (status == null) {
                return ResponseEntity.badRequest().body(ResponseResult.error("状态字段不能为空")); // 400 Bad Request
            }

            // 调用服务层更新用户状态
            ResponseResult rr = userService.updateUserStatus(userId, status);
            return ResponseEntity.ok(ResponseResult.ok("状态更新成功").setData(rr));
        } catch (IllegalArgumentException e) {
            return ResponseEntity.badRequest().body(ResponseResult.error("状态更新失败").setData(e.getMessage())); // 400 Bad Request
        }
    }

    /**
     * 更新用户信息（管理员可以更新所有，普通用户只能更新自己）。
     * URL: PUT /users/{userId}
     * 权限：拥有 'ADMIN' 角色，或者请求的用户ID与路径中的ID一致。
     */
    @PutMapping("{userId}")
    @PreAuthorize("hasRole('ADMIN') or #userId == T(java.lang.Long).parseLong(authentication.principal.toString())")
    public ResponseEntity<ResponseResult> updateUser(@PathVariable("userId") Long userId, UserDTO userDTO) {
        // 获取当前认证用户的ID (从 Gateway 传递的 X-User-ID 头中获取)
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        log.info("[CONTROLLER] Principal: " + auth.getPrincipal());
        log.info("[CONTROLLER] Roles: " + auth.getAuthorities());

        String currentUserId = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

//        // 如果不是管理员且请求的ID不是当前用户ID，则拒绝访问
//        if (!SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream()
//                .anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN")) && !currentUserId.equals(String.valueOf(userId))) {
//            return ResponseEntity.status(HttpStatus.FORBIDDEN).body(ResponseResult.error("您没有权限更新该用户").setData("您没有权限更新该用户")); // 403 Forbidden
//        }

        try {
            UserDTO updatedUser = userService.updateUser(userId, userDTO);
            return ResponseEntity.ok(ResponseResult.ok("更新成功").setData(updatedUser));
        } catch (IllegalArgumentException e) {
            return ResponseEntity.badRequest().body(ResponseResult.error("更新失败").setData(e.getMessage())); // 400 Bad Request
        }
    }

    /**
     * 更新用户密码（需要验证旧密码）。
     * URL: PUT /users/{userId}/password
     * 权限：只能更新自己的密码。
     */
    @PutMapping("/{userId}/password")
    @PreAuthorize("#userId == T(java.lang.Long).parseLong(authentication.principal.toString())")
    public ResponseEntity<ResponseResult> updatePassword(@PathVariable("userId") Long userId,
                                                         @RequestBody Map<String, String> passwordData) {
        String oldPassword = passwordData.get("oldPassword");
        String newPassword = passwordData.get("newPassword");

        if (oldPassword == null || newPassword == null || oldPassword.isEmpty() || newPassword.isEmpty()) {
            return ResponseEntity.badRequest().body(ResponseResult.error("旧密码和新密码不能为空"));
        }

        try {
            userService.updatePassword(userId, oldPassword, newPassword);
            return ResponseEntity.ok(ResponseResult.ok("密码更新成功"));
        } catch (IllegalArgumentException e) {
            return ResponseEntity.badRequest().body(ResponseResult.error(e.getMessage())); // 旧密码不正确或用户不存在
        } catch (NoSuchAlgorithmException e) {
            log.severe("密码加密失败: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ResponseResult.error("服务器内部错误，密码更新失败"));
        }
    }

    //管理员获取总用户数，商品数，订单数，总营业额
    @GetMapping("/admin/maindata")
//    @PreAuthorize("hasRole('ADMIN')")
    public ResponseEntity<ResponseResult> getAdminStatistics() {
        try {
            // 调用服务层方法获取统计信息
            Map<String, Object> statistics = userService.getAdminStatistics();
            return ResponseEntity.ok(ResponseResult.ok("统计信息获取成功").setData(statistics));
        } catch (Exception e) {
            log.severe("获取统计信息失败: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ResponseResult.error("服务器内部错误，统计信息获取失败"));
        }
    }
}